package com.ruitu.router_module.jpush;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Build;
import android.service.notification.StatusBarNotification;
import android.support.annotation.RequiresApi;
import android.support.v4.app.NotificationCompat;
import android.text.TextUtils;
import android.util.Log;

import com.beanu.arad.Arad;
import com.beanu.arad.utils.Logg;
import com.ruitu.router_module.A_Rutils;
import com.ruitu.router_module.CommonUtils;
import com.ruitu.router_module.R;
import com.ruitu.router_module.utils.MediaUtil;

import java.util.List;

import cn.jpush.android.api.CmdMessage;
import cn.jpush.android.api.CustomMessage;
import cn.jpush.android.api.JPushInterface;
import cn.jpush.android.api.JPushMessage;
import cn.jpush.android.api.NotificationMessage;
import cn.jpush.android.service.JPushMessageReceiver;

/**
 * 自定义JPush message 接收器,包括操作tag/alias的结果返回(仅仅包含tag/alias新接口部分)
 */
public class MyJPushMessageReceiver extends JPushMessageReceiver {
    private static final String TAG = Logg.TAG;

    @Override// 收到自定义消息回调
    public void onMessage(Context context, CustomMessage customMessage) {
        Log.e(TAG, "[收到自定义消息] " + customMessage);
//        processCustomMessage(context, customMessage);
    }

    @Override
    public void onNotifyMessageOpened(Context context, NotificationMessage message) {
        Log.e(TAG, "[点击通知] " + message);
        if (CommonUtils.isLogin()) {
            try {
                A_Rutils.startNewActivity(context, "com.ruitu.mall_98.activity.SysMsgListActivity", null);
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onNotifyMessageArrived(Context context, NotificationMessage message) {
        Log.e(TAG, "[收到通知] " + message);
        musicStart();

        try {
//            processNotification(context, message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override// 清除通知
    public void onNotifyMessageDismiss(Context context, NotificationMessage message) {
        Log.e(TAG, "[清除通知] " + message);
    }

    private void processNotification(Context context, NotificationMessage ntfMsg) throws Exception {
        /**
         *  这个地方特殊说明一下
         *  因为我们发出推送大部分是分为两种，一种是在极光官网直接发送推送，第二是根据后台定义
         * 的NOTIFICATION发送通知，所以在这里你要根据不同的方式获取不同的内容
         **/
        //如果是使用后台定的NOTIFICATION发送推送，那么使用下面的方式接收消息
        String alert = ntfMsg.notificationExtras;  //扩展消息
        String title = ntfMsg.notificationTitle;  //推送标题
        String msg = ntfMsg.notificationContent;   //推送消息

        //如果是直接使用极光官网发送推送，那么使用这个来接收消息内容
        // String title = bundle.getString(JPushInterface.EXTRA_TITLE);
        //String msg = bundle.getString(JPushInterface.EXTRA_MESSAGE);
        //  String extras = bundle.getString(JPushInterface.EXTRA_EXTRA);

        NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        NotificationCompat.Builder builder;
        int notifactionId = ntfMsg.notificationId;//获取推送id

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // 通知渠道的id 这个地方只要一直即可
            String id = ntfMsg.notificationChannelId;
//            // 用户可以看到的通知渠道的名字.
//            CharSequence name = "九八商城";
//            // 用户可以看到的通知渠道的描述
//            String description = msg;
//            int importance = NotificationManager.IMPORTANCE_HIGH;
//
//            NotificationChannel mChannel = new NotificationChannel(id + "_98", name, importance);
//            // 自定义声音
//            mChannel.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.dingding), null);
//            // 配置通知渠道的属性
//            mChannel.setDescription(description);
//            // 设置通知出现时的闪灯（如果 android 设备支持的话）
////            mChannel.enableLights(true);
////            mChannel.setLightColor(Color.RED);
//            // 设置通知出现时的震动（如果 android 设备支持的话）
//            mChannel.enableVibration(true);
////            mChannel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
//            //最后在notificationmanager中创建该通知渠道
//            notificationManager.createNotificationChannel(mChannel);

            builder = new NotificationCompat.Builder(context, id);
            Logg.i("使用NotificationChannel...");
        } else {
            builder = new NotificationCompat.Builder(context);
            Logg.i("使用早期的Notification...");
        }

        //这一步必须要有而且setSmallIcon也必须要，没有就会设置自定义声音不成功
        builder.setAutoCancel(true).setSmallIcon(R.drawable.app_push_icon);
        // 设置通知铃声
        builder.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.dingding));
        //这是点击通知栏做的对应跳转操作，可以根据自己需求定义
        PendingIntent pendingIntent = null;
        if (CommonUtils.isLogin()) {
            pendingIntent = A_Rutils.genPendingIntent(context, "com.ruitu.mall_98.activity.SysMsgListActivity", null);
        }
        if (null != pendingIntent) {
            builder.setContentIntent(pendingIntent);
        }
        builder.setAutoCancel(true)
                .setContentText(msg)
                .setContentTitle(title.equals("") ? "九八商城" : title)
                .setSmallIcon(R.drawable.app_push_icon);
        //bundle.get(JPushInterface.EXTRA_ALERT);推送内容
        //最后刷新notification是必须的
//        notificationManager = (NotificationManager) context.getSystemService(NOTIFICATION_SERVICE);
        notificationManager.notify(notifactionId, builder.build()); //在此处放入推送id —notifactionId
    }

    private void musicStart() {
        MediaUtil.mediaPlay(R.raw.dingding, Arad.app);// 开始播放铃声
    }

    private void musicStop() {
        MediaUtil.mediaStop();// 停止播放铃声
    }

    @RequiresApi(api = Build.VERSION_CODES.O)
    private static void deleteNoNumberNotification(NotificationManager nm, String newChannelId) {
        List<NotificationChannel> notificationChannels = nm.getNotificationChannels();
        if (null == notificationChannels || notificationChannels.size() < 5) {
            return;
        }
        for (NotificationChannel channel : notificationChannels) {
            if (channel.getId() == null || channel.getId().equals(newChannelId)) {
                continue;
            }

            int notificationNumbers = getNotificationNumbers(nm, channel.getId());
            Logg.i("notificationNumbers: " + notificationNumbers + " channelId:" + channel.getId());
            if (notificationNumbers == 0) {
                Logg.i("deleteNoNumberNotification: " + channel.getId());
                nm.deleteNotificationChannel(channel.getId());
            }
        }
    }

    /**
     * 获取某个渠道下状态栏上通知显示个数
     *
     * @param mNotificationManager NotificationManager
     * @param channelId            String
     * @return int
     */
    @RequiresApi(api = Build.VERSION_CODES.O)
    private static int getNotificationNumbers(NotificationManager mNotificationManager, String channelId) {
        if (mNotificationManager == null || TextUtils.isEmpty(channelId)) {
            return -1;
        }
        int numbers = 0;
        StatusBarNotification[] activeNotifications = mNotificationManager.getActiveNotifications();
        for (StatusBarNotification item : activeNotifications) {
            Notification notification = item.getNotification();
            if (notification != null) {
                if (channelId.equals(notification.getChannelId())) {
                    numbers++;
                }
            }
        }
        return numbers;
    }


    @Override// 注册成功回调
    public void onRegister(Context context, String registrationId) {
        Log.e(TAG, "[注册成功] " + registrationId);
    }

    @Override// 长连接状态回调
    public void onConnected(Context context, boolean isConnected) {
        Log.e(TAG, "[长连接状态回调] " + isConnected);
    }

    @Override// 注册失败回调
    public void onCommandResult(Context context, CmdMessage cmdMessage) {
        Log.e(TAG, "[注册失败回调] " + cmdMessage);
    }

    @Override// tag 增删查改的操作会在此方法中回调结果。
    public void onTagOperatorResult(Context context, JPushMessage jPushMessage) {
        TagAliasOperatorHelper.getInstance().onTagOperatorResult(context, jPushMessage);
        super.onTagOperatorResult(context, jPushMessage);
    }

    @Override// 查询某个 tag 与当前用户的绑定状态的操作会在此方法中回调结果。
    public void onCheckTagOperatorResult(Context context, JPushMessage jPushMessage) {
        TagAliasOperatorHelper.getInstance().onCheckTagOperatorResult(context, jPushMessage);
        super.onCheckTagOperatorResult(context, jPushMessage);
    }

    @Override// alias 相关的操作会在此方法中回调结果。
    public void onAliasOperatorResult(Context context, JPushMessage jPushMessage) {
        TagAliasOperatorHelper.getInstance().onAliasOperatorResult(context, jPushMessage);
        super.onAliasOperatorResult(context, jPushMessage);
    }

    @Override// 设置手机号码会在此方法中回调结果。
    public void onMobileNumberOperatorResult(Context context, JPushMessage jPushMessage) {
        TagAliasOperatorHelper.getInstance().onMobileNumberOperatorResult(context, jPushMessage);
        super.onMobileNumberOperatorResult(context, jPushMessage);
    }

    /**
     * 开始支持的版本：3.3.2
     * 说明 如果需要在旧版本的Receiver接收cn.jpush.android.intent.NOTIFICATION_CLICK_ACTION广播
     * 可以不重写此方法，或者重写此方法且调用super.onMultiActionClicked
     * 如果重写此方法，没有调用super，则不会发送广播到旧版本Receiver
     */
    @Override// 通知的MultiAction回调
    public void onMultiActionClicked(Context context, Intent intent) {
        Log.e(TAG, "[onMultiActionClicked] 用户点击了通知栏按钮");
        String nActionExtra = intent.getExtras().getString(JPushInterface.EXTRA_NOTIFICATION_ACTION_EXTRA);

        //开发者根据不同 Action 携带的 extra 字段来分配不同的动作。
        if (nActionExtra == null) {
            Log.d(TAG, "ACTION_NOTIFICATION_CLICK_ACTION nActionExtra is null");
            return;
        }
        if (nActionExtra.equals("my_extra1")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮一");
        } else if (nActionExtra.equals("my_extra2")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮二");
        } else if (nActionExtra.equals("my_extra3")) {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮三");
        } else {
            Log.e(TAG, "[onMultiActionClicked] 用户点击通知栏按钮未定义");
        }
    }
}
